home *** CD-ROM | disk | FTP | other *** search
/ Gekikoh Dennoh Club 2 / Gekikoh Dennoh Club Vol. 2 (Japan).7z / Gekikoh Dennoh Club Vol. 2 (Japan) (Track 01).bin / kowin / font / code131.lzh / code.c next >
C/C++ Source or Header  |  1995-09-01  |  13KB  |  549 lines

  1. /*/ ******************************************************************* /*/
  2. /*/                                    /*/
  3. /*/       Code.win  version 1.10       1990 11/20 by 小笠原博之    /*/
  4. /*/                             SPS0783 COR.    /*/
  5. /*/                                    /*/
  6. /*/    v1.10 1991 1/16 Ko-Window 2.07 対応                /*/
  7. /*/    v1.11 1991 2/2    フォントデータの獲得                /*/
  8. /*/    v1.20 1991 2/4  コード計算の改良                /*/
  9. /*/    v1.30 1991 3/11 Ko-Window 2.10 対応、UserSheet 対応        /*/
  10. /*/    v1.31 1995 8/6  表示フォントの変更が可能になった (tvv編集用)    /*/
  11. /*/ ******************************************************************* /*/
  12.  
  13. #include    <stdio.h>
  14. #include    <wlib.h>
  15. #include    <parts.h>
  16.  
  17. #include    "mpat.h"
  18.  
  19. #define        USERSHEET    /**/
  20.  
  21.  
  22. /** 区点コード変換 **/
  23. #define        JISKUTEN(a)    ((a / 0x100 - 0x20)*100+ ((a & 0xff) - 0x20))
  24. #define        KUTENJIS(a)    ((a / 100 +0x20)*0x100+ ((a % 100)+0x20 ))
  25.  
  26. /** 半角チェック **/
  27. #define        ishan(a)    ((a>=0x8000&&a<=0x8100)||(a>=0xf000&&a<0xf600))
  28.  
  29. #define        mJIS    0
  30. #define        mSJIS    1
  31. #define        mKUTEN    2
  32.  
  33. #define        aJIS    0
  34. #define        aSJIS    1
  35. #define        aKUTEN    2
  36. #define        aCHAR    3
  37.  
  38. /* リソース */
  39.  
  40. #define        MODEX    (2+24+54+4)
  41. #define        MODEY    30
  42. #define        MODEXX    (2+24+54+4+36+10)
  43. #define        MODEYY    50
  44. #define        MODESX    (2+24+54+8)
  45. #define        MODESY    34
  46.  
  47. #define        INCX    2
  48. #define        INCY    2
  49. #define        INCXX    (12+4+2)
  50. #define        INCYY    13
  51. #define        INCSX    5
  52. #define        INCSY    2
  53.  
  54. #define        DECX    2
  55. #define        DECY    15
  56. #define        DECXX    (12+4+2)
  57. #define        DECYY    26
  58. #define        DECSX    5
  59. #define        DECSY    15
  60.  
  61. #define        INPX    (2+24+54+4)
  62. #define        INPY    6
  63.  
  64.  
  65. /*/
  66. /*    イベント定義
  67. /*/
  68. #define        EVENT    (EventOpenON        \
  69.             |EventRedrawON        \
  70.             |EventCloseON        \
  71.             |EventKeyON        \
  72.             |EventMouseEnterON    \
  73.             |EventMouseOutON    \
  74.             |EventUserON        \
  75.             |EventMouseSwitchON)
  76.  
  77. /*//////////////////////////////////////////////////////////////////////*/
  78. /* グローバル宣言                            */
  79. /*//////////////////////////////////////////////////////////////////////*/
  80.  
  81. /*** function ***/
  82. int        EventExec();
  83.  
  84. /*** heap size ***/
  85. /*int    WindowHeapSize = 4 * 1024;    /**/
  86.  
  87. unsigned char    s_jis[10],
  88.         s_sjis[10],
  89.         s_kuten[10],
  90.         s_chr[4],
  91.         buf_jis[10];
  92.  
  93. InputClass    i_jis;
  94.  
  95. int        sjis= 0x819f;
  96.  
  97. int        mode= mJIS;
  98.  
  99. char        *modestr[ 3 ]={
  100.             "JIS",
  101.             "シフトJIS",
  102.             " 区点 "
  103.         };
  104.  
  105. int        flag= FALSE;
  106. int        font= 16;
  107.  
  108. /*//////////////////////////////////////////////////////////////////////*/
  109. /* メインルーチン                            */
  110. /*//////////////////////////////////////////////////////////////////////*/
  111. void
  112. WindowMain( argc, argv )
  113. char    **argv;
  114. {
  115.     int        x,
  116.             y;
  117.  
  118.     /*/
  119.     /*    オプション解析
  120.     /*/
  121.  
  122.     s_chr[2]= '\0';
  123.     for( x= y= 2 ; --argc ; ){
  124.         if( **++argv == '-' || **argv == '/' ){
  125.             switch( (*argv)[1] ){
  126.             case 'x':
  127.                 x= atoi( *argv+2 );
  128.                 break;
  129.             case 'y':
  130.                 y= atoi( *argv+2 );
  131.                 break;
  132.             case 's':
  133.                 sjis= strtol( *argv+2, argv, 0 );
  134.                 break;
  135.             case 'f':
  136.                 font= atoi( *argv+2 );
  137.                 if( font != 24 && font != 16 &&
  138.                                     font != 12 && font != 10 )
  139.                     font= 16;
  140.             }
  141.         }
  142.     }
  143.  
  144.     /*/
  145.     /*    ウィンドウ設定
  146.     /*/
  147.     WindowSetEventAttr( WindowTitleOpen( x, y, 140-3, 58-2, NULL, "Code", Close|Push, EventExec ), EVENT );
  148.  
  149. }
  150.  
  151. /*//////////////////////////////////////////////////////////////////////*/
  152. /* イベント処理ルーチン                            */
  153. /*//////////////////////////////////////////////////////////////////////*/
  154. EventExec( wp, info )
  155. WindowID    wp;
  156. EventInfo    *info;
  157. {
  158.     int    x;
  159.     DrawBuf    buf[30];
  160.  
  161.     switch( info->option ){
  162.         case EventOpen:
  163.             InputSet( &i_jis, INPX, INPY, buf_jis, 8, 9, 16 );
  164.             WindowRedraw( wp );
  165.             return    TRUE;
  166.  
  167.         case EventRedraw:    {
  168.             int    i= 12;
  169.             DrawSetClear( buf, 1 );
  170.             DrawSetCode( buf+1, 0 );    /* 4 */
  171.             DrawSetSymbol( buf+5, INCSX, INCSY, "+1", 9, 12 );
  172.             DrawSetSymbol( buf+6, DECSX, DECSY, "-1", 9, 12 );
  173.             DrawSetLine( buf+7, INCX, INCY, INCXX, INCYY, ShadowUp, OptionShadow );
  174.             DrawSetLine( buf+8, DECX, DECY, DECXX, DECYY, ShadowUp, OptionShadow );
  175.             DrawSetSymbol( buf+9, MODESX, MODESY, modestr[mode], 9, 12 );
  176.             DrawSetLine( buf+10, MODEX, MODEY, MODEXX, MODEYY, ShadowUp, OptionShadow );
  177.             DrawSetLine( buf+11, INPX, INPY+17, INPX+48, INPY+17, 0, OptionLine );
  178.             WindowDraw( wp, buf, i+InputSetDraw( buf+12, &i_jis ) );
  179.             return    TRUE;
  180.         }
  181.  
  182.         case EventClose:
  183.             WindowClose( wp );
  184.             WindowConnectionClose();
  185.             return    TRUE;
  186.  
  187.         case EventMouseSwitch:
  188.             if( info->x>INCX && info->x<INCXX && info->y>INCY && info->y<INCYY ){
  189.                 if( info->RightStat ){
  190.                     while( WindowGetEventInfo(info), info->RightStat ){
  191.                         inc1();
  192.                         DrawSetCode( buf, wp );
  193.                     }
  194.                 }else if( info->LeftON ){
  195.                     inc1();
  196.                     DrawSetCode( buf, wp );
  197.                 }
  198.                 return    TRUE;
  199.             }else if( info->x>DECX && info->x<DECXX && info->y>DECY && info->y<DECYY ){
  200.                 if( info->RightStat ){
  201.                     while( WindowGetEventInfo(info), info->RightStat ){
  202.                         dec1();
  203.                         DrawSetCode( buf, wp );
  204.                     }
  205.                 }else if( info->LeftON ){
  206.                     dec1();
  207.                     DrawSetCode( buf, wp );
  208.                 }
  209.                 return    TRUE;
  210.             }else if( info->LeftON && info->x>MODEX && info->x<MODEXX && info->y>MODEY && info->y<MODEYY ){
  211.                 mode= (mode+1) % 3;
  212.                 DrawSetSymbol( buf, MODESX, MODESY, modestr[mode], 9, 12 );
  213.                 WindowDraw( wp, buf, 1 );
  214.                 return    TRUE;
  215.             }else if( info->LeftON ){
  216.                 WindowID    cwp,
  217.                         awp;
  218.                 EventInfo    info2;
  219.                 int        area= aKUTEN;
  220.                 mspatset();
  221.                 mspat(1);
  222.                 if( info->x < 24+2 )
  223.                     area= aCHAR;
  224.                 else if( info->y< 20 )
  225.                     area= aJIS;
  226.                 else if( info->y < 40 )
  227.                     area= aSJIS;
  228.                 while( !(WindowGetEventInfo(info) && info->LeftOFF) );
  229.                 cwp= WindowGetChild( WindowRootID, info );
  230.                 if( cwp && cwp != wp ){
  231.                     unsigned char    combuf[40],
  232.                             *comptr= combuf;
  233.                     int        i;
  234.                     *comptr= '\0';
  235.                     switch( area ){
  236.                     case aJIS:
  237.                         i= SFTJIS( sjis );
  238.                         if( i< 0 )
  239.                             strcpy( combuf, "????" );
  240.                         else
  241.                             sprintf( combuf, "%04X", i );
  242.                         break;
  243.                     case aSJIS:
  244.                         sprintf( combuf, "%04X", sjis );
  245.                         break;
  246.                     case aKUTEN:
  247.                         i= SFTJIS( sjis );
  248.                         if( i< 0 )
  249.                             strcpy( combuf, "????" );
  250.                         else
  251.                             sprintf( combuf, "%04d", JISKUTEN(i) );
  252.                         break;
  253.                     case aCHAR:
  254.                         *combuf=   sjis/0x100;
  255.                         combuf[1]= sjis & 0xff;
  256.                         combuf[2]= '\0';
  257.                     }
  258.                     while( *comptr ){
  259.                         info2.option= EventKey;
  260.                         info2.KeyCode= *comptr++;
  261.                         WindowSendEvent( cwp, &info2 );
  262.                     }
  263.                     if( area= aCHAR ){
  264.                         unsigned short    ptr[76+2];
  265.                         unsigned short    ptr2[76+2];
  266.                         unsigned char    *ptrp;
  267.                         unsigned char    *ptrp2;
  268.                         struct    FontPack {
  269.                                 short    x,
  270.                                     y;
  271.                                 short    code,
  272.                                     sendx,
  273.                                     sendy;
  274.                             }    pack;
  275.                         void        *compack[4]= {
  276.                                     (void*)0,
  277.                                     (void*)"\0FontData",
  278.                                     (void*)&pack
  279.                                 };
  280. #ifdef    USERSHEET
  281.                         struct    {
  282.                                 int    h,
  283.                                     v,
  284.                                     hword;
  285.                                 short    *buf1,
  286.                                     *buf2;
  287.                                 int    sendx,
  288.                                     sendy;
  289.                             } sheet;
  290.                         unsigned short    ptr3[76+2];
  291. #endif
  292.                         int    j;
  293.                         FNTGET( font/2, sjis, ptr );
  294.                         for( j=2 ; j<38 ; j++ )
  295.                             ptr[j]= ~ptr[j];
  296.                         switch( ptr[0] ){
  297.                         case 8:
  298.                             ptrp= (unsigned char**)(ptr+2);
  299.                             for( j=2 ; j<38 ; j++ )
  300.                                 ptr2[j]= (*ptrp++<<8)+255;
  301. #ifdef    USERSHEET
  302.                             sheet.buf1= ptr2+2;
  303. #endif
  304.                             compack[3]= (void*)(ptr2+2);
  305.                             break;
  306.                         case 16:
  307. #ifdef    USERSHEET
  308.                             sheet.buf1= ptr+2;
  309. #endif
  310.                             compack[3]= (void*)(ptr+2);
  311.                             break;
  312.                         case 24:
  313.                             ptrp= (unsigned char**)(ptr+2);
  314.                             ptrp2= (unsigned char**)(ptr2+2);
  315.                             for( j=0 ; j<24 ; j++ ){
  316.                                 *ptrp2++= *ptrp++;
  317.                                 *ptrp2++= *ptrp++;
  318.                                 *ptrp2++= *ptrp++;
  319.                                 *ptrp2++= 255;
  320.                             }
  321. #ifdef    USERSHEET
  322.                             sheet.buf1= ptr2+2;
  323. #endif
  324.                             compack[3]= (void*)(ptr2+2);
  325.                             break;
  326.                         case 12:
  327.                             ptrp= (unsigned char**)(ptr+2);
  328.                             ptrp2= (unsigned char**)(ptr2+2);
  329.                             for( j=0 ; j<24 ; j++ ){
  330.                                 *ptrp2++= *ptrp++;
  331.                                 *ptrp2++= *ptrp++;
  332.                             }
  333. #ifdef    USERSHEET
  334.                             sheet.buf1= ptr2+2;
  335. #endif
  336.                             compack[3]= (void*)(ptr2+2);
  337.                         case 10:
  338.                             ptrp= (unsigned char**)(ptr+2);
  339.                             ptrp2= (unsigned char**)(ptr2+2);
  340.                             for( j=0 ; j<20 ; j++ ){
  341.                                 *ptrp2++= *ptrp++;
  342.                                 *ptrp2++= *ptrp++;
  343.                             }
  344. #ifdef    USERSHEET
  345.                             sheet.buf1= ptr2+2;
  346. #endif
  347.                             compack[3]= (void*)(ptr2+2);
  348.  
  349.  
  350.  
  351.                         }
  352. #ifdef    USERSHEET
  353.                         sheet.h= font;
  354.                         sheet.v= font;
  355.                         sheet.hword= (font+8)/16;
  356.                         sheet.sendx= info->x;
  357.                         sheet.sendy= info->y;
  358.                         for( j=0 ; j<48 ; j++ )
  359.                             ptr3[j]= 0;
  360.                         sheet.buf2= ptr3;
  361. #endif
  362.                         pack.x= font;
  363.                         pack.y= font;
  364.                         pack.code= 1;
  365.                         pack.sendx= info->x;
  366.                         pack.sendy= info->y;
  367.  
  368.                         info2.option= EventUser;
  369.                         info2.ComBuffer= compack;
  370.                         info2.ComData= 256;
  371. /*                        WindowSendEvent( cwp, &info2 );
  372. */
  373. #ifdef    USERSHEET
  374.                         info2.option= EventUser;
  375.                         info2.ComBuffer= &sheet;
  376.                         info2.ComData= UserSheet;
  377.                         WindowSendEvent( cwp, &info2 );
  378. #endif
  379.                     }
  380.                 }
  381.                 mspat(0);
  382.                 return    TRUE;
  383.  
  384.  
  385.             }else if(info->RightON ) {
  386.                 if ( info->x<27 && info->x>1 &&
  387.                                      info->y<54 && info->y>28 ) {
  388.                     switch(font) {
  389.                     case 10:
  390.                         font=24;
  391.                         break;
  392.                     case 12:
  393.                         font=10;
  394.                         break;
  395.                     case 16:
  396.                         font=12;
  397.                         break;
  398.                     case 24:
  399.                         font=16;
  400.                         break;
  401.                     }
  402.                     DrawSetLine(buf,1,28,25,52,1,OptionFill);
  403.                     DrawSetCode(buf+1,0);
  404.                     WindowDraw(wp,buf,5); /* 1+4 */
  405.                     return TRUE;
  406.                 }
  407.                 return FALSE;
  408.  
  409.  
  410.             }
  411.             break;
  412.  
  413.         case EventKey:
  414.             if( info->KeyCode != 13 ){
  415.                 int    i;
  416.                 i= InputKey( buf, &i_jis, info->KeyCode, info->ShiftStat );
  417.                 if( flag ){
  418.                     info->KeyCode= 13;
  419.                     WindowSendEvent( wp, info );
  420.                 }else{
  421.                     if( info->KeyCode >=0x80 )
  422.                         flag= TRUE;
  423.                     else
  424.                         flag= FALSE;
  425.                     WindowDraw( wp, buf, i );
  426.                 }
  427.             }else{
  428.                 int    i;
  429.                 char    *p;
  430.                 flag= FALSE;
  431.                 if( *buf_jis >= 0x80 ){
  432.                     i= *buf_jis*256+ buf_jis[1];
  433.                 }else{
  434.                     switch( mode ){
  435.                     case mJIS:
  436.                         i= JISSFT( strtol( buf_jis, &p, 16 ) );
  437.                         break;
  438.                     case mSJIS:
  439.                         i= strtol( buf_jis, &p, 16 );
  440.                         break;
  441.                     case mKUTEN:
  442.                         i= JISSFT( KUTENJIS( atoi( buf_jis ) ));
  443.                     }
  444.                 }
  445.                 if( i>= 0x8000 ){
  446.                     clearkey( buf, wp );
  447.                     sjis= i;
  448.                     DrawSetLine(buf,1,28,25,52,1,OptionFill);
  449.                     DrawSetCode( buf+1, 0 );
  450.                     WindowDraw(wp,buf,5);
  451.                 }
  452.             }
  453.             return    TRUE;
  454.  
  455.         case EventMouseEnter:
  456.         case EventMouseOut:    {
  457.             int    i= InputSetCursorVisible( buf, &i_jis, info->option==EventMouseEnter );
  458.             if( i )
  459.                 WindowDraw( wp, buf, i );
  460.             return    TRUE;
  461.         }
  462.  
  463. /** Paste 情報の受取 1991 01/16 Ko-Window 2.07 に対応化 **/
  464.         case EventUser:    {
  465.             char    *ptr= (char*)info->ComBuffer;
  466.             if( info->ComData == UserPaste || info->ComData == UserString ){
  467.                 while( *ptr ){
  468.                     info->option= EventKey;
  469.                     info->KeyCode= *ptr++;
  470.                     WindowSendEvent( wp, info );
  471.                 }
  472.             }
  473.             return    TRUE;
  474.         }
  475. /*********************************************************/
  476.     }
  477.  
  478.     return    FALSE;
  479. }
  480.  
  481. /** コード表示 **/
  482. DrawSetCode( buf, wp )
  483. DrawBuf        *buf;
  484. WindowID    wp;
  485. {
  486.     int    jis,
  487.         kuten;
  488.     if( (jis= SFTJIS( sjis )) < 0 ){
  489.         strcpy( s_jis, "JIS  ????" );
  490.         strcpy( s_kuten, "区点 ????" );
  491.     }else{
  492.         sprintf( s_jis, "JIS  %04X", jis );
  493.         kuten= JISKUTEN( jis );
  494.         sprintf( s_kuten, "区点 %04d", kuten );
  495.     }
  496.     sprintf( s_sjis, "SJIS %04X", sjis );
  497.     *s_chr= sjis/0x100;
  498.     s_chr[1]= sjis & 0xff;
  499.     DrawSetSymbol( buf  , 2+24, 3 ,  s_jis,   9, 12 );
  500.     DrawSetSymbol( buf+1, 2+24, 21, s_sjis,  9, 12 );
  501.     DrawSetSymbol( buf+2, 2+24, 39, s_kuten, 9, 12 );
  502.     DrawSetSymbol( buf+3, 1   , 28, s_chr,   9, font );
  503.     if( wp )
  504.         WindowDraw( wp, buf, 4 );
  505. }
  506.  
  507.  
  508. /** シフトJISコードのインクリメント **/
  509. inc1()
  510. {
  511.     int    i;
  512.     do{
  513.         if( ++sjis == 0xf600 )
  514.             sjis= 0x8000;
  515.     }while( !ishan(sjis) && ((i= sjis & 0xff)<0x40 || i==0x7f || i>0xfc ));
  516. }
  517.  
  518. /** シフトJISコードのデクリメント **/
  519. dec1()
  520. {
  521.     int    i;
  522.     do{
  523.         if( --sjis < 0x8000 )
  524.             sjis= 0xf5ff;
  525.     }while( !ishan(sjis) && ((i= sjis & 0xff)<0x40 || i==0x7f || i>0xfc ));
  526. }
  527.  
  528. /** キーバッファのクリア **/
  529. clearkey( buf, wp )
  530. DrawBuf        *buf;
  531. WindowID    wp;
  532. {
  533.     DrawSetLine( buf, INPX, INPY, INPX+48, INPY+16, 1, OptionFill );
  534.     InputSetCursor( &i_jis, 0 );
  535.     *buf_jis= '\0';
  536.     WindowDraw( wp, buf, 1+ InputSetDraw( buf+1, &i_jis ) );
  537. }
  538.  
  539.  
  540. /** JISコードシフトJISへの変換 **/
  541. JISSFT( code )
  542. unsigned int    code;
  543. {
  544.     unsigned int    h= (code >> 8) & 0x7f,
  545.             l= code & 0x7f;
  546.     return    (( ((h-1)>>1 ) + ((h<=0x5e) ? 0x71 : 0xb1) )<<8)+( l + ((h & 1) ? ((l < 0x60) ? 0x1f : 0x20) : 0x7e) );
  547. }
  548.  
  549.